@RequestPart (파일 + json 전송)
NOTE
하나의 요청으로 파일과 JSON을 함께 전송할 때(@RequestPart / ObjectMapper) 처리 방법과 Content-Type 이슈.
📌 개념
- form-data로 요청 시: JSON 값 + File 을 함께 전송
- JSON 값 처리
ObjectMapper로 역직렬화- 또는
@RequestPart로 DTO 받기
- JSON 값 처리
IMPORTANT
문제 발생 상황
- File과 Text를 함께 전달하면
application/octet-stream으로 전달되는 경우가 있음.@RequestPart는 form-data에서만 사용 가능 → 이 경우ObjectMapper로 처리해야 함.
💻 예시
@PostMapping(value = "/api/v1/s3/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> upload(@RequestPart("file") MultipartFile file,
@RequestPart("data") UploadMetaDto data) {
// ...
}
// ObjectMapper 방식
@RequestMapping(value = "/api/v1/s3/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestHeader(value = "sendDate", required = false) String sendDate,
@RequestParam(value = "file", required = false) MultipartFile file,
@RequestParam(value = "data", required = false) String data) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(data, Map.class);
// ...
}NOTE
octet-stream: 스트림 형태로 값을 전달하는 형태의 Content-Type.
관련 문서
- (토이프로젝트) [File I/O #5] MultiPartFile (Form데이터) 처리하기 — MultipartFile을 단독으로 받는 처리 방식을 다루는 토이프로젝트 노트로, 이 문서의 파일+JSON 동시 전송(@RequestPart) 시나리오와 대비됨